package com.itmentu.core;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * @Author：http://www.itmentu.com
 * @date： 2021/12/5 16:35
 * @Description：
 ***/
public class ClassUtil {

    /**
     * 获取表明
     */
    public static String tableName(Class clazz){
        //获取表名注解
        TableName tableName = (TableName) clazz.getDeclaredAnnotation(TableName.class);
        return tableName.value();
    }

    /**
     * 获取主键列和主键列对应属性名字
     */
    public static String tableId(Class clazz){
        //获取主键列
        for (Field declaredField : clazz.getDeclaredFields()) {
            TableField annotation = declaredField.getAnnotation(TableField.class);
            if(annotation.id()){
                //主键列、属性名字
                return annotation.value()+"=#{"+declaredField.getName()+"}";
            }
        }
        return null;
    }

    /**
     * 修改操作
     */
    public static String[] forUpdate(Object instance) throws Exception {
        //1)定义集合存储所有列名
        List<String> columns = new ArrayList<String>();
        //2)获取对象Class，并拿到对象所有Field
        Class<?> clazz = instance.getClass();
        Field[] declaredFields = clazz.getDeclaredFields();
        //3)循环所有Field，判断该Field是否为空，如果不为空，且不为id，则表示要添加该对象
        for (Field declaredField : declaredFields) {
            //3.1)暴力破解
            declaredField.setAccessible(true);
            //3.2)获取该属性值
            Object result = declaredField.get(instance);
            //3.3)属性值如果不为空，切不为空，则需要动态添加该列属性
            if(result!=null){
                //3.4)获取列名注解
                TableField tableField = declaredField.getAnnotation(TableField.class);
                boolean isId = tableField.id();
                if(!isId){
                    //3.5)获取列名
                    columns.add(tableField.value()+"=#{"+declaredField.getName()+"}");
                }
            }
        }
        //结果转换
        String[] columnArrays = new String[columns.size()];
        columns.toArray(columnArrays);
        return columnArrays;
    }

    /**
     * 获取一个对象中值不为空的属性
     */
    public static List<String[]> fieldNames(Object instance) throws Exception {
        //1)定义集合存储所有列名
        List<String> columns = new ArrayList<String>();
        List<String> propertyList = new ArrayList<String>();
        //2)获取对象Class，并拿到对象所有Field
        Class<?> clazz = instance.getClass();
        Field[] declaredFields = clazz.getDeclaredFields();
        //3)循环所有Field，判断该Field是否为空，如果不为空，且不为id，则表示要添加该对象
        for (Field declaredField : declaredFields) {
            //3.1)暴力破解
            declaredField.setAccessible(true);
            //3.2)获取该属性值
            Object result = declaredField.get(instance);
            //3.3)属性值如果不为空，切不为空，则需要动态添加该列属性
            if(result!=null){
                //3.4)获取列名注解
                TableField tableField = declaredField.getAnnotation(TableField.class);
                boolean isId = tableField.id();
                if(!isId){
                    //3.5)获取列名
                    columns.add(tableField.value());
                    propertyList.add("#{"+declaredField.getName()+"}");
                }
            }
        }
        //结果转换
        String[] columnArrays = new String[columns.size()];
        String[] propertyArrays = new String[columns.size()];
        columns.toArray(columnArrays);
        propertyList.toArray(propertyArrays);

        //结果返回
        List<String[]> results =new ArrayList<String[]>();
        results.add(columnArrays);
        results.add(propertyArrays);
        return results;
    }
}
